<!DOCTYPE HTML>
<html lang="zh-CN">

<head>
    <!--Setting-->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <meta http-equiv="Cache-Control" content="no-siteapp">
    <meta http-equiv="Cache-Control" content="no-transform">
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
    <meta name="apple-mobile-web-app-capable" content="涛哥的博客">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no,email=no,adress=no">
    <meta name="browsermode" content="application">
    <meta name="screen-orientation" content="portrait">
    <meta name="theme-version" content="1.2.3">
    <meta name="root" content="/">
    <link rel="dns-prefetch" href="https://jaredtao.github.io">
    <!--SEO-->

<meta name="keywords" content="Qt,Qt实用技能,Qt发布" />


<meta name="description" content="
简介
背景
Qt的安装
Qt的目录结构
Qt安装路径
Qt核心路径


HelloDeploy
Window编译和发布
Window 编译
Window 发布
VS运行时库
常见的错误处理
应..." />


<meta name="robots" content="all" />
<meta name="google" content="all" />
<meta name="googlebot" content="all" />
<meta name="verify" content="all" />
    <!--Title-->

<title>
    
    玩转Qt(9)-程序发布指南 |
    
    涛哥的博客
</title>

<link rel="alternate" href="/atom.xml" title="涛哥的博客" type="application/atom+xml">


<link rel="icon" href="/favicon.ico">

    


<link rel="stylesheet" href="/css/bootstrap.min.css?rev=3.3.7.css">
<link rel="stylesheet" href="/css/font-awesome.min.css?rev=4.7.0.css">
<link rel="stylesheet" href="/css/style.css?rev=@@hash.css">

    
<div class="hide">
    <script type="text/javascript">
    var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");
    document.write(unescape("%3Cspan class='cnzz_stat_icon_1263868967 hide' %3E%3Cscript%20src%3D%22https%3A%2F%2Fs95.cnzz.com%2Fz_stat.php%3Fweb_id%3D1272564536%22%3E%3C%2Fscript%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s19.cnzz.com/z_stat.php%3Fid%3D1263868967%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));
    </script>
</div>




    

<script>
(function() {
    var bp = document.createElement('script');
    var curProtocol = window.location.protocol.split(':')[0];
    if (curProtocol === 'https') {
        bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
    } else {
        bp.src = 'http://push.zhanzhang.baidu.com/push.js';
    }
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(bp, s);
})();
</script>

<meta name="generator" content="Hexo 4.2.1"></head>
<!--[if lte IE 8]>
<style>
    html{ font-size: 1em }
</style>
<![endif]-->
<!--[if lte IE 9]>
<div style="ie">你使用的浏览器版本过低，为了你更好的阅读体验，请更新浏览器的版本或者使用其他现代浏览器，比如Chrome、Firefox、Safari等。</div>
<![endif]-->
<body>
    <header class="main-header"  style="background-image:url(
    http://snippet.shenliyang.com/img/banner.jpg)"
     >
    <div class="main-header-box">
        <a class="header-avatar" href="/" title='JaredTao'>
            <img src="/img/avatar.jpg" alt="logo头像" class="img-responsive center-block">
        </a>
        <div class="branding">
            <!--<h2 class="text-hide">Snippet主题,从未如此简单有趣</h2>-->
            
            <h2>
                单枪匹马亦对饮，历经磨难记初心
            </h2>
            
        </div>
    </div>
</header>
    <nav class="main-navigation">
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                <div class="navbar-header"><span class="nav-toggle-button collapsed pull-right" data-toggle="collapse" data-target="#main-menu" id="mnav">
                        <span class="sr-only"></span>
                        <i class="fa fa-bars"></i>
                    </span>
                    <a class="navbar-brand" href="https://jaredtao.github.io">
                        涛哥的博客</a>
                </div>
                <div class="collapse navbar-collapse" id="main-menu">
                    <ul class="menu">
                        
                        <li role="presentation" class="text-center">
                            <a href="/"><i class="fa "></i>
                                首页</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/categories/玩转Qt/"><i class="fa "></i>
                                玩转Qt</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/categories/玩转Qml/"><i class="fa "></i>
                                玩转Qml</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/categories/玩转QtQuick/"><i class="fa "></i>
                                玩转QtQuick</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/categories/涛哥的博客/"><i class="fa "></i>
                                涛哥的博客</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/archives/"><i class="fa "></i>
                                时间轴</a>
                        </li>
                        
                    </ul>
                </div>
            </div>
        </div>
    </div>
</nav>
    <section class="content-wrap">
        <div class="container">
            <div class="row">
                <main class="col-md-8 main-content m-post">
                    <p id="process"></p>
<article class="post">
    <div class="post-head">
        <h1 id="玩转Qt(9)-程序发布指南">
            
            玩转Qt(9)-程序发布指南
            
        </h1>
        <div class="post-meta">
    
    <span class="categories-meta fa-wrap">
        <i class="fa fa-folder-open-o"></i>
        <a class="category-link" href="/categories/%E7%8E%A9%E8%BD%ACQt/">玩转Qt</a>
    </span>
    
    
    <span class="fa-wrap">
        <i class="fa fa-tags"></i>
        <span class="tags-meta">
            
            <a class="tag-link" href="/tags/Qt/" rel="tag">Qt</a> <a class="tag-link" href="/tags/Qt%E5%8F%91%E5%B8%83/" rel="tag">Qt发布</a> <a class="tag-link" href="/tags/Qt%E5%AE%9E%E7%94%A8%E6%8A%80%E8%83%BD/" rel="tag">Qt实用技能</a>
            
        </span>
    </span>
    
    
    
    <span class="fa-wrap">
        <i class="fa fa-clock-o"></i>
        <span class="date-meta">
            2019/09/12</span>
    </span>
    
    <span class="fa-wrap">
        <i class="fa fa-eye"></i>
        <span id="busuanzi_value_page_pv"></span>
    </span>
    
    
</div>
        
        
        <p class="fa fa-exclamation-triangle warning">
            本文于<strong>
                572</strong>
            天之前发表，文中内容可能已经过时。
        </p>
        
    </div>
    
<div id="post-gallery">
    
    <img src="/img/avatar.jpg" alt="gallery-img" class="gallery">
    
</div>

    <div class="post-body post-content">
        <ul>
<li><a href="#%e7%ae%80%e4%bb%8b">简介</a></li>
<li><a href="#%e8%83%8c%e6%99%af">背景</a></li>
<li><a href="#qt%e7%9a%84%e5%ae%89%e8%a3%85">Qt的安装</a></li>
<li><a href="#qt%e7%9a%84%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84">Qt的目录结构</a><ul>
<li><a href="#qt%e5%ae%89%e8%a3%85%e8%b7%af%e5%be%84">Qt安装路径</a></li>
<li><a href="#qt%e6%a0%b8%e5%bf%83%e8%b7%af%e5%be%84">Qt核心路径</a></li>
</ul>
</li>
<li><a href="#hellodeploy">HelloDeploy</a></li>
<li><a href="#window%e7%bc%96%e8%af%91%e5%92%8c%e5%8f%91%e5%b8%83">Window编译和发布</a><ul>
<li><a href="#window-%e7%bc%96%e8%af%91">Window 编译</a></li>
<li><a href="#window-%e5%8f%91%e5%b8%83">Window 发布</a></li>
<li><a href="#vs%e8%bf%90%e8%a1%8c%e6%97%b6%e5%ba%93">VS运行时库</a></li>
<li><a href="#%e5%b8%b8%e8%a7%81%e7%9a%84%e9%94%99%e8%af%af%e5%a4%84%e7%90%86">常见的错误处理</a><ul>
<li><a href="#%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e6%97%a0%e6%b3%95%e6%ad%a3%e5%b8%b8%e5%90%af%e5%8a%a8">应用程序无法正常启动</a></li>
<li><a href="#%e5%90%af%e5%8a%a8%e5%a4%b1%e8%b4%a5---no-qt-platform-plugin">启动失败 - no Qt platform plugin</a></li>
<li><a href="#opengl-context-%e5%88%9b%e5%bb%ba%e5%a4%b1%e8%b4%a5">OpenGL Context 创建失败</a></li>
</ul>
</li>
<li><a href="#%e6%95%b4%e7%90%86">整理</a></li>
<li><a href="#%e7%ae%80%e5%8d%95%e8%a3%81%e5%89%aa">简单裁剪</a><ul>
<li><a href="#%e5%88%a0%e5%87%8fdll">删减dll</a></li>
<li><a href="#%e5%88%a0%e5%87%8fplugins">删减plugins</a></li>
<li><a href="#%e5%88%a0%e5%87%8fqml">删减qml</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>这次讨论发布Qt应用程序的知识点。</p>
<h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><p>有很多人向涛哥询问，Qt程序发布的相关问题，网络上虽然可以搜到一大堆教程，但是可靠的比较少。</p>
<p>所以这次尽我所能，全面、详细地整理一些Qt程序发布的知识点，希望能帮助到更多人。</p>
<p>对老手来说，很多坑都踩过了，无非就是把正确的dll放在正确的路径。</p>
<p>对新手来说，细节上能多说几句，都将是莫大的帮助，少走弯路，节省几个小时、甚至几天都是有可能的。</p>
<p>如果有疏漏、错误，也欢迎大家补充、指正。</p>
<h1 id="Qt的安装"><a href="#Qt的安装" class="headerlink" title="Qt的安装"></a>Qt的安装</h1><p>Qt官网下载地址在这： <a href="http://download.qt.io/official_releases" target="_blank" rel="noopener">http://download.qt.io/official_releases</a></p>
<p>离线安装包 或者 在线安装包 都行。</p>
<p>关于Qt版本的选择，涛哥建议：</p>
<pre><code>体验新特性，就用最新版本；项目开发，用长期支持版(LTS)的最后一个修正版本，稳定、bug最少。</code></pre><p>可以在Qt官方wiki上查看相关信息 <a href="https://wiki.qt.io/Main" target="_blank" rel="noopener">https://wiki.qt.io/Main</a></p>
<p>目前为止(2019/9/2)，最新版为5.13.0，LTS版本有5.9 和 5.12， 而5.9最后一个修正版本是5.9.8， 5.12则是到5.12.4</p>
<p><img src="/images/QtDeployment/01.png" alt="预览"></p>
<p>例如上图是5.9.8的离线安装包，提供了windows、mac以及linux三种系统的可执行程序。</p>
<p>其中windows的安装程序”qt-opensource-windoiws-x86-5.9.8.exe”, 大小有2.4G，里面</p>
<p>包含了msvc_x86、msvc_x64、mingw、Android等多个版本的Qt工具链。在下载完成，安装</p>
<p>过程中可以分别勾选。其它版本也是类似的。</p>
<p>如何安装Qt，就不细说了，搞不定的去参考入门级教程吧…</p>
<h1 id="Qt的目录结构"><a href="#Qt的目录结构" class="headerlink" title="Qt的目录结构"></a>Qt的目录结构</h1><p>这里假设大家都装好了Qt，先来了解一下Qt的安装路径都有哪些东西。</p>
<p>涛哥用的是Windows 10系统，安装的Qt版本是5.12.4，以此为例来说明，其它系统和版本以实际为准。</p>
<h2 id="Qt安装路径"><a href="#Qt安装路径" class="headerlink" title="Qt安装路径"></a>Qt安装路径</h2><p>涛哥安装在了D:\Qt\Online 路径下, 如图:</p>
<p><img src="/images/QtDeployment/QtStruct.png" alt="预览"></p>
<p>其中“vcredist”文件夹包含了msvc2015 和 msvc2017的运行时库安装程序(后面会说怎么用,不是msvc编译器不需要)</p>
<p><img src="/images/QtDeployment/2.png" alt="预览"></p>
<p>“Tools”文件夹，包括QtCreator、OpenSSL库(可选)以及两种版本MinGW(可选)。</p>
<p><img src="/images/QtDeployment/3.png" alt="预览"></p>
<p>(图中还有Qt3DStudio,可忽略)</p>
<p>“5.12.4”文件夹，是Qt的核心路径, 里面包含多个版本的Qt工具链、头文件、动态链接库等</p>
<p><img src="/images/QtDeployment/1.png" alt="预览"></p>
<p>这里涛哥安装了msvc2017、msvc2017_64、mingw73_64以及android_x86.</p>
<p>注意msvc2017是x86架构的Qt库，msvc2017_64则是x64架构的。</p>
<p>如果有msvc2013、msvc2015也同理。</p>
<h2 id="Qt核心路径"><a href="#Qt核心路径" class="headerlink" title="Qt核心路径"></a>Qt核心路径</h2><p>接下来看一下重点，Qt的核心路径， 以msvc2017_64文件夹为例</p>
<p><img src="/images/QtDeployment/4.png" alt="预览"></p>
<p>bin文件夹包含了Qt提供的各种工具exe程序，以及动态链接库的dll</p>
<p>其中工具包括qmake.exe 和 windeployqt.exe，windeployqt.exe是我们今天主要讨论的工具。</p>
<p>动态链接库全部是两份dll，比如Qt5Cored.dll和Qt5Core.dll，文件名末尾带’d’表示debug版本的，另一个不带’d’的是release版本。</p>
<p><img src="/images/QtDeployment/5.png" alt="预览"></p>
<p>debug版本和release版本的主要区别：debug没有开编译器优化、携带了调试信息，release开了编译器优化O2,去掉了多余的信息</p>
<p>(图中还有pdb文件，是涛哥单独安装的，用来调试Qt源码，可以忽略)</p>
<p>和bin同级的，还有plugins文件夹，包含一些Qt用到的插件</p>
<p><img src="/images/QtDeployment/6.png" alt="预览"></p>
<p>比如imageformats文件夹中提供了jepg、gif、webp等图片格式的功能支持的插件，platforms文件夹则提供了平台插件，特别是</p>
<p>qwindows.dll这一个，在windows平台是必不可少的。</p>
<p>和bin同级的，另外一个文件夹是’qml’文件夹，包含Qml的各种功能模块。</p>
<p>和bin同级的其它文件夹，resources是WebEngine模块专用的，translations提供了</p>
<p>Qt内置的翻译文件，剩下的和发布无关，就不多说了。</p>
<h1 id="HelloDeploy"><a href="#HelloDeploy" class="headerlink" title="HelloDeploy"></a>HelloDeploy</h1><p>这里新建一个简单的Hello World程序，名字就叫”HelloDeploy”。</p>
<p>同时为了说明问题，涛哥添加一些常用的模块。</p>
<p>在pro文件中，QT += 那一行该写的都写上：</p>
<p><img src="/images/QtDeployment/8.png" alt="预览"></p>
<p>在main.cpp中包含一下各个模块的头文件，再分别创建一个对象实例，调用一些简单的函数：</p>
<p><img src="/images/QtDeployment/9.png" alt="预览"></p>
<p>这样一个多模块依赖的程序就写好了。</p>
<h1 id="Window编译和发布"><a href="#Window编译和发布" class="headerlink" title="Window编译和发布"></a>Window编译和发布</h1><h2 id="Window-编译"><a href="#Window-编译" class="headerlink" title="Window 编译"></a>Window 编译</h2><p>这里要特别注意，编译器的选择, 以及编译用的是debug模式还是release模式。</p>
<p>涛哥这里是msvc2017_x64版本</p>
<p><img src="/images/QtDeployment/10.png" alt="预览"></p>
<p>一般发布用release模式。</p>
<p><img src="/images/QtDeployment/11.png" alt="预览"></p>
<p>编译完成后，默认在build-xxxx-release/release/文件夹中会生成我们的exe程序。</p>
<p><img src="/images/QtDeployment/12.png" alt="预览"></p>
<p><img src="/images/QtDeployment/13.png" alt="预览"></p>
<p>我们将这个exe复制出来，新建一个release文件夹，放进去</p>
<p><img src="/images/QtDeployment/14.png" alt="预览"></p>
<p>这时候可以尝试双击运行它，会提示缺少dll</p>
<p><img src="/images/QtDeployment/15.png" alt="预览"></p>
<h2 id="Window-发布"><a href="#Window-发布" class="headerlink" title="Window 发布"></a>Window 发布</h2><p>发布程序，其实就是把exe程序依赖的dll和相关资源都放在一起，保证双击运行即可。</p>
<p>我们前面提过的windeployqt.exe，是Qt提供的命令行工具，能帮助我们自动把需要的dll或资源复制过来。</p>
<ol>
<li>我们先打开一个命令行</li>
</ol>
<p>可以从开始菜单找到Qt提供的命令行</p>
<p><img src="/images/QtDeployment/16.png" alt="预览"></p>
<p>注意选对版本。这种命令行在启动时已经设置好了QT的环境变量，可以直接输入windeployqt.exe</p>
<p>也可以用普通的命令行，使用windeployqt.exe时带上绝对路径即可。</p>
<p>涛哥一般用普通的命令行，因为绝对路径不易出错。</p>
<ol start="2">
<li>cd到release目录</li>
</ol>
<p>这里说一个windows启动命令行的小技巧：在release文件夹中，按住键盘shift键，然后按鼠标右键，弹出的右键菜单，</p>
<p>会比普通的右键菜单多一个“在此处打开命令窗口”，点击就能在release文件夹打开命令行窗口。</p>
<p><img src="/images/QtDeployment/17.png" alt="预览"></p>
<p>如果没有这个功能，就得手动输入cd指令，进入release路径。</p>
<p><img src="/images/QtDeployment/18.png" alt="预览"></p>
<ol start="3">
<li>执行windeployqt命令</li>
</ol>
<p>这里通过绝对路径来使用windeployqt：</p>
<p>d:\qt\Online\5.12.4\msvc2017_64\bin\windeployqt.exe HelloDeploy.exe</p>
<p><img src="/images/QtDeployment/19.png" alt="预览"></p>
<p>HelloDeploy这个程序还用到了Qml，用到Qml的程序，要给windeployqt加上qmldir参数，写上你的Qml文件所在文件夹</p>
<p>(没用到qml的程序，不要加这一步)</p>
<p>d:\qt\Online\5.12.4\msvc2017_64\bin\windeployqt.exe HelloDeploy.exe –qmldir .\qml</p>
<p><img src="/images/QtDeployment/20.png" alt="预览"></p>
<p>写好windeployqt命令后按回车执行</p>
<p><img src="/images/QtDeployment/21.png" alt="预览"></p>
<p>正确执行后，release文件夹下，多了很多dll，以及一些文件夹。</p>
<p><img src="/images/QtDeployment/22.png" alt="预览"></p>
<p>这时候我们双击运行HelloDeploy.exe, 就可以正常启动了。</p>
<p>将整个文件夹压缩或拷贝到其它没有Qt环境的电脑上，也是可以启动的。</p>
<p>只要dll齐备了，制作安装包也不是问题。(后续有时间，我再写安装包制作的教程)</p>
<h2 id="VS运行时库"><a href="#VS运行时库" class="headerlink" title="VS运行时库"></a>VS运行时库</h2><p>如果是VS编译的程序，需要将QT路径下对应的vcredist_xxx.exe带上。</p>
<p>如果其它电脑上有vs运行时则可以直接运行，如果没有，就需要运行一下vs运行时安装包。</p>
<p>或者将运行时库里面的dll复制出来即可。</p>
<p>一般在VS的安装路径，都有展开的dll，可以直接拷贝。</p>
<p>例如，涛哥电脑上的vs2017路径如下：</p>
<p><img src="/images/QtDeployment/msvc.png" alt="预览"></p>
<p>按实际的路径找到这几个dll，全部拷贝即可。注意x86和x64，别拿错了。</p>
<h2 id="常见的错误处理"><a href="#常见的错误处理" class="headerlink" title="常见的错误处理"></a>常见的错误处理</h2><p>一般使用windeployqt，大部分库都能自动拷贝，不需要手动处理，</p>
<p>只有极少数情况下，windeployqt跑完，会缺失一些库，还要手动处理一下。</p>
<p>遇到这种情况，用依赖检查工具Dependencies即可快速定位问题。</p>
<p>Dependencies下载链接:  <a href="https://github.com/lucasg/Dependencies" target="_blank" rel="noopener">https://github.com/lucasg/Dependencies</a></p>
<p>Dependencies 下载好，点击”DependenciesGui.exe”就可以打开界面。注意是名字带Gui的那个，不带gui的“Dependencies.exe”是命令行程序。</p>
<p><img src="/images/QtDeployment/depency.jpg" alt="预览"></p>
<p>下面列举一些常见的错误信息</p>
<h3 id="应用程序无法正常启动"><a href="#应用程序无法正常启动" class="headerlink" title="应用程序无法正常启动"></a>应用程序无法正常启动</h3><p><img src="/images/QtDeployment/23.png" alt="预览"></p>
<p>最容易出现这种错误的情况是，程序是64位编译出来的，而同级目录下的dll是32位的，</p>
<p>或者同级目录下没有dll，但是环境变量中指向了32位的dll。(所以涛哥没有设置环境变量)</p>
<p>32位和64位倒过来也是。</p>
<p>如果dll版本是匹配的，还有可能出现的情况是缺少第三方库。</p>
<p>这里说一个检查依赖的方法：</p>
<p>将HelloDeploy.exe重命名为HelloDeploy.dll，然后用Dependencies打开，就可以查看少哪些库</p>
<p><img src="/images/QtDeployment/24.png" alt="预览"></p>
<p>如上图，红色问号的表示缺少的库。</p>
<p>找齐了依赖的库，再把程序的扩展名改回exe即可。</p>
<h3 id="启动失败-no-Qt-platform-plugin"><a href="#启动失败-no-Qt-platform-plugin" class="headerlink" title="启动失败 - no Qt platform plugin"></a>启动失败 - no Qt platform plugin</h3><p><img src="/images/QtDeployment/27.png" alt="预览"></p>
<p>这种情况，是QT路径下的 plugins/platforms/qwindows.dll文件没有复制过来。</p>
<p>注意这个dll文件直接复制到exe同级是不起作用的，要放在exe程序同级的platforms文件夹里，或者同级</p>
<p>的plugins/platforms文件夹里</p>
<h3 id="OpenGL-Context-创建失败"><a href="#OpenGL-Context-创建失败" class="headerlink" title="OpenGL Context 创建失败"></a>OpenGL Context 创建失败</h3><p><img src="/images/QtDeployment/25.png" alt="预览"></p>
<p>这种情况，一般是OpenGL相关的库没有复制过来，补上就好了</p>
<p><img src="/images/QtDeployment/26.png" alt="预览"></p>
<h2 id="整理"><a href="#整理" class="headerlink" title="整理"></a>整理</h2><p>我们看到，exe同级目录下，windeployqt将一堆的文件夹放在了那里，有些混乱。</p>
<p><img src="/images/QtDeployment/28.png" alt="预览"></p>
<p>涛哥观察并验证了一下，其实可以做个简单的整理。</p>
<p><img src="/images/QtDeployment/29.png" alt="预览"></p>
<p>Qt开头的文件夹都是qml的模块，剩下的文件夹除了translations都是Qt的插件，</p>
<p>所以新建两个文件夹qml和plugins, 分别把qml模块和插件归入其中。</p>
<p><img src="/images/QtDeployment/30.png" alt="预览"></p>
<p>这样的结构，和QT安装路径下的结构是相似的。</p>
<p>这也正是Qt支持的插件加载路径、qml模块加载路径。</p>
<p>同级的dll则是windows系统默认的动态库加载规则，不方便修改</p>
<p>可以参考msdn：</p>
<p><a href="https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order</a></p>
<h2 id="简单裁剪"><a href="#简单裁剪" class="headerlink" title="简单裁剪"></a>简单裁剪</h2><p>如果你熟悉Qt的各个模块，可以进行一些裁剪。以下都是些个人经验。</p>
<p>不熟悉请慎重！</p>
<p>不熟悉请慎重！</p>
<p>不熟悉请慎重！</p>
<p>(当然静态编译也是一种裁剪的途径)</p>
<h3 id="删减dll"><a href="#删减dll" class="headerlink" title="删减dll"></a>删减dll</h3><p>首先可以把单元测试的dll去掉</p>
<p>Qt5Test.dll</p>
<p>Qt5QuickTest.dll</p>
<p>如果没用到windows扩展，Qt5WinExtras.dll也可以去掉</p>
<p>其次，如果你不需要内置的翻译文件，translations文件夹也可以删掉</p>
<p><img src="/images/QtDeployment/32.png" alt="预览"></p>
<h3 id="删减plugins"><a href="#删减plugins" class="headerlink" title="删减plugins"></a>删减plugins</h3><p>再来看一下plugins：</p>
<p>其中platforms是必不可少的，剩下的HelloDeploy都没用到，可以去掉。</p>
<p><img src="/images/QtDeployment/33.png" alt="预览"></p>
<p>常见程序会用的包括:</p>
<p> imageformats 图片格式支持</p>
<p> iconengines 小图标功能</p>
<p> sqldrivers 数据库驱动，这个保留用到的数据库足够了</p>
<p> 其他的看情况删减。</p>
<h3 id="删减qml"><a href="#删减qml" class="headerlink" title="删减qml"></a>删减qml</h3><p>最后看一下Qml文件夹，如果程序完全没用qml，直接删掉就好了。</p>
<p><img src="/images/QtDeployment/34.png" alt="预览"></p>
<p>按windeployqt给HelloDeploy提供的这些，逐个文件夹来说:</p>
<ul>
<li>Qt/labs 一般不推荐Qml中引入labs中的实验品，但是有些情况下功能缺失，只能引入。</li>
</ul>
<p>如果Qml中使用了Quick.Dialog(不是labs.Dialog)，它本身还是依赖的labs中的东西，一般是folderlistmodel和settings，</p>
<p>这时候还是不要动labs了，就按照windeployqt给的放着。</p>
<ul>
<li><p>Qt/WebSockets Qml的Websocket功能，用了就放着，没用可以删掉。</p>
</li>
<li><p>QtGraphicalEffects Qml的一些ShaderEffect特效，用了就放着，没用到可以删掉</p>
</li>
<li><p>QtMultimedia Qml的多媒体模块，用了就放着，没用到可以删掉</p>
</li>
<li><p>QtQml/Models.2 数据Model, 经常用。</p>
</li>
<li><p>QtQuick 这里面大部分都是Qml中常用的，QtQuick/Extras可以按情况删掉</p>
</li>
<li><p>QtQuick.2 常用的</p>
</li>
<li><p>QtTest 单元测试，删掉吧</p>
</li>
<li><p>QtWinExtras Windows扩展，没用到可以去掉</p>
</li>
</ul>

    </div>
    
    <div class="reward" ontouchstart>
    <div class="reward-wrap">赏
        <div class="reward-box">
            
            <span class="reward-type">
                <img class="alipay" src="/img/zhifubao.jpg"><b>支付宝打赏</b>
            </span>
            
            
            <span class="reward-type">
                <img class="wechat" src="/img/weixin.jpg"><b>微信打赏</b>
            </span>
            
        </div>
    </div>
    <p class="reward-tip">
        为众人抱薪者,不可使其冻毙于霜雪
    </p>
</div>
    
    <div class="post-footer">
        <div>
            
            转载声明：
            文章采用<a href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可, 转载请注明出处 © <a href="https://jaredtao.github.io" target="_blank">武威的涛哥</a>
            
            
        </div>
        <div>
            
        </div>
    </div>
</article>
<div class="article-nav prev-next-wrap clearfix">
    
    <a href="/2019/11/19/%E7%8E%A9%E8%BD%ACQt(10)-github-Actions%E8%87%AA%E5%8A%A8%E5%8C%96%E7%BC%96%E8%AF%91/" class="pre-post btn btn-default" title='玩转Qt(10)-github-Actions自动化编译'>
        <i class="fa fa-angle-left fa-fw"></i><span class="hidden-lg">上一篇</span>
        <span class="hidden-xs">
            玩转Qt(10)-github-Actions自动化编译</span>
    </a>
    
    
    <a href="/2019/09/02/%E7%8E%A9%E8%BD%ACQt(8)-%E6%8E%8C%E6%8F%A1%E4%BF%A1%E5%8F%B7%E6%A7%BD%E4%BD%BF%E7%94%A8%E7%BB%86%E8%8A%82/" class="next-post btn btn-default" title='玩转Qt(8)-掌握信号槽使用细节'>
        <span class="hidden-lg">下一篇</span>
        <span class="hidden-xs">
            玩转Qt(8)-掌握信号槽使用细节</span><i class="fa fa-angle-right fa-fw"></i>
    </a>
    
</div>

<div id="comments">
    

<div id="vcomments" class="valine"></div>

<script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
<script src="/assets/valine.min.js"></script>

<script>
new Valine({
    av: AV,
    el: '#vcomments',
    appId: 'qegD4552u6FU9HoNDvRsonko-gzGzoHsz',
    appKey: 'eitB2FV5n2qyMHcDM7x6EQpt',
    placeholder: '说点什么吧',
    notify: false,
    verify: true,
    avatar: 'mm',
    meta: 'nick,mail'.split(','),
    pageSize: '10',
    path: window.location.pathname,
    lang: 'zh-CN'.toLowerCase()
})
</script>


</div>


                </main>
                
                    <aside id="article-toc" role="navigation" class="col-md-4">
    <div class="widget">
        <h3 class="title">
            文章目录
        </h3>
        
        <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#简介"><span class="toc-text">简介</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#背景"><span class="toc-text">背景</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#Qt的安装"><span class="toc-text">Qt的安装</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#Qt的目录结构"><span class="toc-text">Qt的目录结构</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#Qt安装路径"><span class="toc-text">Qt安装路径</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Qt核心路径"><span class="toc-text">Qt核心路径</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#HelloDeploy"><span class="toc-text">HelloDeploy</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#Window编译和发布"><span class="toc-text">Window编译和发布</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#Window-编译"><span class="toc-text">Window 编译</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Window-发布"><span class="toc-text">Window 发布</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#VS运行时库"><span class="toc-text">VS运行时库</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#常见的错误处理"><span class="toc-text">常见的错误处理</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#应用程序无法正常启动"><span class="toc-text">应用程序无法正常启动</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#启动失败-no-Qt-platform-plugin"><span class="toc-text">启动失败 - no Qt platform plugin</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#OpenGL-Context-创建失败"><span class="toc-text">OpenGL Context 创建失败</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#整理"><span class="toc-text">整理</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#简单裁剪"><span class="toc-text">简单裁剪</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#删减dll"><span class="toc-text">删减dll</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#删减plugins"><span class="toc-text">删减plugins</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#删减qml"><span class="toc-text">删减qml</span></a></li></ol></li></ol></li></ol>
        
    </div>
</aside>
                
            </div>
        </div>
    </section>
    <footer class="main-footer">
    <div class="container">
        <div class="row">
        </div>
    </div>
</footer>
<a id="back-to-top" class="icon-btn hide">
    <i class="fa fa-chevron-up"></i>
</a>
    <div class="copyright">
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                <div class="busuanzi">
    
    访问量:
    <strong id="busuanzi_value_site_pv">
        <i class="fa fa-spinner fa-spin"></i>
    </strong>
    &nbsp; | &nbsp;
    访客数:
    <strong id="busuanzi_value_site_uv">
        <i class="fa fa-spinner fa-spin"></i>
    </strong>
    
</div>
            </div>
            <div class="col-sm-12">
                <span>Copyright &copy;
                    2019
                    
                </span> |
                <span>
                    Powered by <a href="//hexo.io" class="copyright-links" target="_blank" rel="nofollow">Hexo</a>
                </span> |
                <span>
                    Theme by <a href="//github.com/shenliyang/hexo-theme-snippet.git" class="copyright-links" target="_blank" rel="nofollow">Snippet</a>
                </span>
            </div>
        </div>
    </div>
</div>



<script src="/assets/tagcanvas.min.js?rev=2.9.js"></script>

<script>
var tagOption = {
    textColour: '#444', // 字体颜色
    outlineMethod: 'block', // 选中模式
    outlineColour: '#FFDAB9', // 选中模式的颜色
    interval: 30 || 30, // 动画帧之间的时间间隔，值越大，转动幅度越大
    textHeight: 13,
    outlineRadius: 3,
    freezeActive: true || '', // 选中的标签是否继续滚动
    frontSelect: true || '', // 不选标签云后部的标签
    initial: [0.1, -0.1],
    depth: 0.5,
    decel: 0.95,
    maxSpeed: 0.03,
    reverse: true || '', // 是否反向触发
    fadeIn: 500, // 进入动画时间
    wheelZoom: false || '' // 是否启用鼠标滚轮
}
TagCanvas.Start('tag-cloud-3d', '', tagOption);
</script>


<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>


<script src="/js/app.js?rev=@@hash.js"></script>

</body>
</html>